package com.itany.corejava.code09_集合.map集合;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @author 石小俊
 * @date 2023年05月09日 9:21
 * 控制台输入一个字符串,统计字符串中每个字符出现的次数,保存到HashMap集合中
 * 至少使用两种不同的方式实现
 */
public class Test07_练习 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        // Map<Character,Integer> map = test01(sc.next());
        Map<Character, Integer> map = test02(sc.next());
        System.out.println(map);
    }


    /**
     * 方式一:遍历字符串中的每一个字符,进行统计
     */
    public static HashMap<Character, Integer> test01(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            // 取出当前迭代的字符
            char c = s.charAt(i);
            // 判断当前集合中是否存在指定的key为字符c
            if (map.containsKey(c)) {
                // 将字符c作为key去Map集合中进行查询
                int count = map.get(c);
                // 修改集合中对应key的数据,将其值+1
                map.put(c, count + 1);
            } else {
                // 如果不存在,保存一条新的键值对数据
                // 其key为当前字符c,其value为1
                map.put(c, 1);
            }

            // 简写方式
            // map.put(c, map.containsKey(c) ? map.get(c) + 1 : 1);
        }
        return map;
    }

    /**
     * 方式二:通过将字符串的与第一个字符一致的所有字符均替换为空字符串,出现的次数即为:原来字符串的长度-替换后字符串的长度
     */
    public static HashMap<Character, Integer> test02(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        while (!s.isEmpty()) {
            // 取出字符串中第一个字符
            char c = s.charAt(0);
            // 将字符串的与第一个字符一致的所有字符均替换为空字符串
            String s2 = s.replace(c + "", "");
            // 原来的字符串长度-新的字符串长度=出现的次数
            map.put(c, s.length() - s2.length());
            // 将新的字符串赋值给原字符串,继续下一个字符的替换操作
            s = s2;
        }
        return map;
    }
}
